איך להשתלט על המילה שמפחידה כל מילה — הכלי הנוח למציאת חלקים של מחרוזת בתוך מחרוזת, בדיקת תקינות ועוד אין ספור שימושים בזוג מילים שרק נראה קצת מסובך.
ביטויים רגולריים הם כלי לחיפוש חלקים של מחרוזת בתוך מחרוזת.
אם בא לכם למצוא את כל אותיות ל' שמופיעות בטקסט ומיד אחריהם בא המספר שלוש ולהחליף אותו בשם שלכם - ביטויים רגולריים זה מה שאתם צריכים.
ביטויים רגולריים מאפשרים לכם לחפש תת-מחרוזות לפי תבנית מסוימת.
תבנית דוגמאת האות ל' ואחריה מספר. או כל מילה שמתחילה באות א' או כל דבר אחר.
בהמשך הסבר מלא ודוגמאות של ביטויים רגולריים יחד עם פונקציות php מתאימות, כמה תרגילים להבנה עצמית עם פתרון ואפשרות לשאול שאלות בתגובות.
מה אפשר לעשות עם ביטויים רגולריים?
אם תרצו לבדוק האם המחרוזת שלכם מורכבת אך ורק מאותיות באנגלית,
או להחליף את כל האותיות Z שאחריהם בא מספר באות Q – תשתמשו בביטויים רגולריים. התבניות שלפיהם תתבצע העבודה (הדגשתי אותם) נקראת פטרן.
pattern (תבנית) – מחרוזת תווים, תווים מיוחדים ומודיפיקטורים
שלפיהם יתבצע חיפוש התת-מחרוזות.
preg_match
preg_match היא הפונקציה הבסיסית לחיפוש תת-מחרוזת בתוך מחרוזת לפי ביטוי רגולרי.
היא מקבלת שלושה ארגומנטים, הראשון הוא תבנית החיפוש (הפטרן), השני הוא המחרוזת שבה מחפשים והשלישי הוא משתנה ריק שלתוכו הפונקציה בעצמה תכניס את תוצאות החיפוש. כך לדוגמה, כדי למצוא את ההופעה של 123 בתוך המחרוזת abc123xyz נכתוב את הפונקציה באופן הבא:
$string = 'abc123xyz';
$results = array();
$pattern = '#123#';
preg_match($pattern, $string, $results);
print_r($results);
// Array ( [0] => 123 )
$results = array();
$pattern = '#123#';
preg_match($pattern, $string, $results);
print_r($results);
// Array ( [0] => 123 )
התוצאה תהיה מערך שהאלמנט האפסי שלו יהיה המספר 123 (חיפשנו את 123 והוא נמצא במחרוזת). עד כאן אין לנו שום שימוש מעניין בתוצאות החיפוש, פרט לעובדה שאפשר להשתמש בקוד זה כדי לבדוק האם התת-מחרוזת 123 מופיע בתוך המחרוזת המקורית.
שנו את המחרוזת המקורית למשהו שלא מכיל את 123 והפעילו שוב את הקוד.
מה מכיל המערך כעט?
א. הוא ריק (אפס אלמנטים)
ב. יש אלמנט אחד results[0], אבל אינו מכיל ערך
ג. אלמנט אחד עם הערך abc
שימו לב, הפונקציה strpos הרבה יותר מהירה ועדיפה לבדיקה האם התת-מחרוזת נמצאת בתוך המחרוזת. השתמשו בה במקום.
בדיקה בעזרת preg_match
כדי לבדוק האם preg_match מצאה משהו (כלומר האם במחרוזת המקורית מופיע התת-מחרוזת 123) נוכל לספור את כמות האיברים שיש במערך $results ואם יש יותר מאפס איברים, כנראה שהתת-מחרוזת נמצאה.
הדרך היותר פשוטה היא להשתמש בעובדה ש- preg_match מחזירה את כמות התת-מחרוזות שנמצאו. אם התת-מחרוזת מופיע - preg_match תחזיר את המספר 1, אם לא - אפס. באופן הזה אין צורך ביצירת מערך מיוחד וספירתו אחר כך.
$string = '123456789';
$pattern = '#123#';
if( preg_match($pattern, $string) ) echo 'found';
else echo 'not found';
$pattern = '#123#';
if( preg_match($pattern, $string) ) echo 'found';
else echo 'not found';
php מתרגמת אוטומטית את המספר 1 ל-true ואת 0 ל-false, לכן אפשר להכניס את הפונקציה עצמה לתוך תנאי if כמו בדוגמה. שימו לב ש-preg_match אף פעם לא תחזיר מספר הגדול מאחד. preg_match עוצרת את הבדיקה של המחרוזת המקורית ברגע שנמצאה התאמה אחת. כדי למצוא את כל התת-מחרוזות שתואמות לתבנית נחליף את preg_match ב-preg_match_all שפועלת בצורה זהה בכל השאר.
מהו הקוד הבודק האם יש את המילה php במחרוזת כלשהי?
א. if( preg_match("#php#", $string) ) echo 'found';
ב. if( !preg_match("#php#", $string) ) echo 'found';
ג. if( preg_match("php", $string) ) echo 'found';
מבנה של ביטוי רגולרי – ממה בנוי פטרן
כל פטרן (תבנית חיפוש) של ביטוי רגולרי מכילה כמה חלקים קבועים:
א. תו פתיחה - סגירה
כל פטרן צריך להתחיל ולהסתיים בתווי פתיחה וסגירה שיגידו למנוע הביטויים הרגולריים שזוהי תחילתה וסיומה של התבנית. תו זה יכול להיות כל תו חוץ מ- '\' . לרוב משתמשים בסולמית (#) או בסלש '/'.
ב. תוכן התבנית
התת-מחרוזת שנחפש. במקרה הקודם שלנו הייתה זו 123. התוכן יהיה מורכב לרוב מתווים מיוחדים שנתמקד בהם בהמשך.
ג. מודיפיקטורים
מודיפיקטורים מאפשרים לשנות את הדרך שבה יתנהג מנוע הביטויים הרגולריים עם התבנית שלנו. לדוגמה התבנית abc תתאים רק למחרוזות שמכילות את abc ולא תתאים ל-aBc או ABc .את ההתנהגות הזו אפשר לשנות באמצעות המודיפיקטור i (קיצור של insensitive).
if( preg_match('#BC#i', 'abc23xyz')) echo 'match';
הורידו את המודיפיקטור i ובדקו האם נמצאו האותיות BC במחרוזת המקורית?
תווים מיוחדים
כוחם של הביטויים הרגולריים מתגלה כאשר יש צורך בביטויים יותר מורכבים ממחרוזת ידוע מראש. פונקציונליות זו מושגת באמצעות תווים מיוחדים.
^ — תו המסמן תחילת מחרוזת.
$ — תו המסמן סוף מחרוזת.
הדוגמה הבאה תתאים למחרוזת שמכילה אך ורק את המילה dog. כלומר המחרוזת מתחילה, אחרי ההתחלה, כאות ראשונה, מופיע האות d, אחריה האות o ,אות g ואחריה המחרוזת מסתיימת. בלי שני התווים האלה, גם המחרוזת underdogs תתאים, כיוון שגם היא מכילה את dog ושם והאות d לא חייבת להיות ראשונה במחרוזת.
if( preg_match('#^dog$#i', 'dog')) echo 'good';
מהו הביטוי הרגולרי כדי לבדוק האם המחרוזת מסתיימת באות e?
שימו לב, ביטוי רגולרי נקרא משמאל לימין.
א. #e$#
ב. #e^#
ג. #^e#
. ג'וקר – מסמל כל תו חוץ מתו שורה חדשה (\n).
הנקודה יכולה להחליף כל תו אחר בביטוי הרגולרי, כך למשל גם dog, dag, deg, d1g יתאימו לתבנית הבאה:
$string = 'dog'; // d1g, deg, DUG, dXg, ..
if( preg_match('#^d.g$#i', $string) ) echo 'match';
if( preg_match('#^d.g$#i', $string) ) echo 'match';
התבנית הזו אומרת: מחרוזת שמתחילה באות d, אחריה בה כל תו אפשרי, אחריו האות g וזהו סוף המחרוזת. אם במחרוזת הנבדקת יופיע תו כלשהו אחרי האות g המחרוזת תיכשל בבדיקה, כיוון שהתבנית דורשת שאחרי האות g המחרוזת תסתיים.
שימו לב, שהנקודה מחליפה מקום של תו אחד בלבד.
dooooooog לא תתאים לביטוי הררגולרי של d.g
[] – קבוצה מוגדרת של תווים = תחום (symbol class)
בתוך הסוגריים נמנים התווים שאחד מהם יכול להיות באותו מקום.
#patt[aoe]rn# // matches pattarn,pattorn, pattern
במנוע הביטויים הרגולריים קיימים תחומי תווים מוגדרים מראש. כך למשל a-z הוא תחום שמכיל את כל האותיות מ-a עד z והרישום [a-z] הוא שווה ערך לרישום [abcdefghijklmnopqrstuvwxyz] שמסמל כל אות מהתחום הזה.
$string = 'dog dug d1g d2g deg'; // dag, dbg, dcg, deg, .., dzg
$results = array();
$pattern = '#d[a-z]g#i';
preg_match_all($pattern, $string, $results);
print_r($results);
$results = array();
$pattern = '#d[a-z]g#i';
preg_match_all($pattern, $string, $results);
print_r($results);
התבנית מחפשת מחרוזת שבה נמצאת האות d אחריה באה אות אחת מרצף a-z ואחריה האות g. אם ננסה לרשום מספר או אות בעברית במקום האות האמצעית לא נקבל תוצאות, כיוון שהחיפוש הוא אחר אחת האותיות מתחום a-z.
ניתן לכתוב את התחום A-z או a-Z שכולל את כל האותיות האנגליות הגדולות והקטנות, במקרה שלא השתמשתם במודיפיקטור i.
איזה מהביטויים יבדוק האם המחרוזת מתחילה באות a קטנה, אחריה באה כל אות באנגלית (גדולה או קטנה) ומסתיימת במספר בין 5 ל-7?
א. #^a[A-z][5-7]$#
ב. #^[aA][a-Z][567]$#i
ג. #^aA-z5-7$#i
ממלאי מקום
כפי שנקודה היא ממלאת מקום של כל תו אפשרי, יש ממלאי מקום ספציפיים יותר:
\d — סיפרה אחת. כל תו מ-0 עד 9. קיצור של digit
\D — כל תו שהוא לא סיפרה.
\s — רווח. קיצור של space
\S – כל תו שהוא לא רווח
\w – כל תו שיכול להיות חלק ממילה רגילה (אותיות וקו תחתון)
\W – כל תו שלא יכול להיות מילה (מספרים, דולרים, כוכביות, פסיקים..)
\n – מעבר שורה
כדי לבדוק האם המחרוזת מורכבת מ: האות a, רווח, אות b, רווח, וסיפרה כלשהי, נכתוב את הביטוי #a\sb\s\d# או פשוט #a b \d#
quantifiers
כל ממלאי המקום מחליפים בעצמם תו אחד בלבד. כלומר \d תתאים לסיפרה אחת, אך לא תתאים למספר 19 (תשע-עשרה) כיוון שהוא מורכב משני תווים נפרדים לחלוטין.
כמתים (מהמילה כמות) מאפשרים להגדיר חזרות על תו מסוים כמה פעמים.
כמתים נכתבים באמצעות סוגריים מסולסלים באופן הבא:
$string = 'abccc'; // ab, abc, abcc, abccc
if( preg_match('#^abc{0,3}$#i', $string) ) echo 'match';
if( preg_match('#^abc{0,3}$#i', $string) ) echo 'match';
התבנית הזאת תתאים לכל מחרוזת שמתחילה באות a, אחריה האות b ואחריה בין אפס לשלוש אותיות c. יותר משלוש אותיות c יתנו תוצאה שלילית. מחרוזת בלי האות c תיתן תוצאה חיובית, כיוון שהתבנית מרשה גם אפס חזרות של האות c.
המספר הראשון בסוגריים מסמל את כמות החזרות המינימליות הנדרשות,
המספר השני את כמות החזרות המקסימליות האפשריות.
מספר יחידי בסוגריים {1} יהווה גם את הגבול העליון וגם התחתון בו זמנית.
כדי לקבוע רק את הגבול התחתון יש להשמיט את הספרה השניה בכמת. לדוגמה, לפחות 5 תווים (בין חמש לאינסוף) {5,}
מהו הביטוי שיאפשר לבדוק האם המחרוזת היא מספר תלת-ספרתי?
א. #^\d{3}$#
ב. #\d{3}#
ג. #3 x \d ?#
מהו הביטוי שיאפשר לבדוק האם אורך המחרוזת הוא בין 3 ל-10 תווים?
א. #^.{3,10}$#
ב. #\w{3,10}#
ג. #^{...}?$#
? — סימן שאלה הוא קיצור של {0,1} התו או מופיע פעם אחת, או לא מופיע כלל
+ — פלוס הוא קיצור של {1,} התו מופיע פעם אחת או יותר
* — כוכבית היא קיצור של {0,} התו יכול לא להופיע, או להופיע כמה שבא לו.
מהו הביטוי שיאפשר לבדוק האם המחרוזת מורכבת אך ורק מאותיות באנגלית?
רמז: כל תו הוא אות באנגלית שנמצאת בתחום a-z ויכולה להופיע מספר פעמים לא ידוע, פעם אחת או יותר.
א. #^[a-z]+$#i
ב. #^[A-z]+#
ג. #^[A-z]?$i#
מודיפיקטורים
חוץ מהמודיפיקטור i שגורם לתבנית להתאים גם לאותיות גדולות וגם לאותיות קטונות ישנם כמה מודיפיקטורים נוספים שכדאי להכיר.
u — קיצור של unicode, מוסיף תמיכה ב-utf8. כל הביטויים שלכם עשויים להכיל u
s — גורם לנקודה להתאים גם לתו של מעבר שורה. בלי מודיפיקטור s תו הנקודה . יכול להיות כל תו פרט למעבר שורה(\n)
x — מתעלם מכל הרווחים בביטוי עצמו. אם הביטוי גדול ומבולגן, תוכלו לשים בו רווחים בכל מקום, אבל כדי שהמנוע לא יחשוב שזהו חלק מהתבנית, נשתמש במודיפיקטור x. אולם כדי לייצג רווח במחרוזת עצמה משתמש בסימון ה \s
m — קיצור של multiline. ביטויים רגולריים בדרך כלל פועלים רק על מחרוזות שמורכבות משורה אחת. מבחינתם מעבר שורה הוא סיום המחרוזת והחיפוש בשורה הבאה כבר לא יתבצע, כאילו לא קיים. אם המחרוזת שלכם מכילה כמה שורות, תכללו מודיפיקטור זה בפטרן.
U — אות גדולה מהמילה Ungreedy. המודיפיקטור הזה מבקש ממנוע הביטוי הרגולרי לא להיות קמצן. נניח שתרצו למצוא את כל מה שנמצא בין שני אותיות a במחרוזת abaca. מברירת מחדל, הביטוי a.+a ינסה לתפוס כמה שיותר לעמצו (כי הוא קצמן ורוצה הכל לעצמו) ולכן התוצאה שתקבלו תהיה bac. כדי לגרום לו לעצור ב-a האמצעית נבקש ממנו לא להיות קמצן ולהתספק ב-a הראשונה שימצא באמצעות המודיפיקטור U.
תת-פטרן
זוג תווים נוסף, הסוגריים הם כלי מיוחד בביטויים רגולריים ולהם שני שימושים. הראשון הוא ריבוי אפשרויות, שמאוד דומה לתחום, כאשר הקו האנכי אומר או.
preg_match('#te(st|xt|mp)#', 'test');
הביטוי הזה יתאים לכל מחרוזת שמכילה את האותיות te ואחריהם באים או st או xt או mp. להבדיל מתחום [] האפשרויות יכולות להיות מורכבות מכמה אותיות יחד.
השימוש השני הוא זכירה של חלק כלשהו.
preg_match('#t(e|o|i)st#', 'test', $results);
print_r($results);
// Array ( [0] => test [1] => e )
print_r($results);
// Array ( [0] => test [1] => e )
מנוע הביטויים הרגולריים יזכור לא רק את כל הטקסט שהתאים לתבנית,
אלה גם את הטקסט שהתאים לתת-תבנית שנמצאת בסוגריים.
אפשר לגשת אל מה שהמנוע מצא (התת-מחרוזת שעונה לתת-תבנית בסוגריים) עוד בהמשך הביטוי עצמו. המנוע שם אותם ב"משתנה רגולרי" שהגישה אליו מתבצעת דרך \1. המשתנה השני יהיה \2 וכך הלאה.
לדוגמה אם נרצה לבדוק שהמחרוזת מורכבת משני אותיות כפולות (aa, bb, cc) נתשמש בסוגריים כדי למצוא ולזכור את האות הראשונה ולאחר מכן לבדוק אם האות השניה זהה לה באופן הבא:
if( preg_match('#([a-z])\\1#', 'aa')) echo 'double';
האות הראשונה יכולה להיות כל אות מתחום a-z. נמצא אותה ונשמור אותה לתוך המשתנה \1. האות שבאה אחר כך צריכה להיות זהה למשתנה 1.
שימו לב, הגישה למשתנה בתוך הביטוי היא עם באקסלאש (\) אחד בלבד. הסיבה שכאן מופיעים שני באקסלאשים היא כדי שphp תדע שהסלאש הבא הוא חלק מהמחרוזת עצמה. פעולה זו נקראת הברחה.
$var = "\\"; echo $var;
preg_replace
preg_replace משמשת להחלפת טקסט בתוך מחרוזת לפי ביטוי רגולרי.
$string = 'blabla my name is Alex blabla ';
echo preg_replace('#my name is [A-z]+#', 'my name is unknown', $string);
echo preg_replace('#my name is [A-z]+#', 'my name is unknown', $string);
הביטוי הזה מחפש בתוך string את המילים my name is שאחריהם באה אות אחת או יותר באנגלית ומחליפה אותם במילים my name is unknown.
המנוע הרגולרי מחפש בתוך string חלק שנראה כמו התבנית. את החלק הזה הוא מחליף בטקסט החדש.
מחיקת תגים:
הקוד הבא מחפש את התת-מחרוזות שדומות לתבנית: סוגר משולש שמאלי, אחריו כל דבר אפשרי, ואחריו סוגר משולש ימני. כל חלקי הטקסט שדומים לתבנית הזו יוחלפו בטקסט ריק. כל שאר חלקי הטקסט ישאר כפי שהיו:
$string = '<tag cool="true">text</tag><b>bold</b><bla />x';
echo preg_replace('#<.*>#U', '', $string); // textboldx
echo preg_replace('#<.*>#U', '', $string); // textboldx
שימוש בזכירה של תת-תבניות
גם בהחלפות אפשר להשתמש באשפרויות הזכירה והמשתנים. למשל כדי להחליף את כל האותיות הכפולות באותיות יחידות נוכל להשתמש בקוד הזה:
$string = 'abbcddeffgghhizz';
echo preg_replace('#([a-z])\\1#', '\\1', $string); //abcdefghiz
echo preg_replace('#([a-z])\\1#', '\\1', $string); //abcdefghiz
הקוד מחפש כל אות באנגלית (ומציב אותה במשתנה) שאחריה באה האות שהוא הציב במשתנה. כל מה שתואם לתבנית הזו הוא מחליף בתוכן של המשתנה.
במילים אחרות הקוד מחפש אות באנגלית, זוכר אותה, ואם אחריה באה בדיוק אותה אות, הוא מחליף את שניהן במה שהוא זכר, כלומר באות אחת.
החלפה של שני משתנים
ביטויים רגולריים מסוגלים לשמור על יותר ממשתנה אחד. לנוחך עובדה זו, אפשר להשתמש בביטוי רגולרי כדי למצוא שני דברים ולהחליף אותם במקום. למשל תיקון תאריך מפורמט אנגלי (חודש/יום/שנה) לפורמט אירופאי (יום/חודש/שנה).
$string = 'the date is: 03/17/2011';
echo preg_replace('# (\d{2}) / (\d{2}) / (\d{4}) #x', '\\2/\\1/\\3', $string);
echo preg_replace('# (\d{2}) / (\d{2}) / (\d{4}) #x', '\\2/\\1/\\3', $string);
שימו לב למודיפיקטור x שגרם לביטוי להתעלם מרווים.
preg_replace_callback
preg_replace_callback מבצעת החלפה לפי ביטוי רגולרי בדומה ל-preg_replace עם הבדל אחד קטן. על כל תת-מחרוזת שנמצאת תואמת לתבנית מופעלת פונקציה שלכם, שבערך המוחזר ממנה משתמשים להחלפה.
נניח ואתם רוצים להגדיל את כל המספרים שמופיעים בטקסט ב-10. נכתוב פונקציה שתקרא עבור כל מספר שימצא, ותחזיר את המספר מוגדל ב-10.
function myfunction($result)
{
print_r($result);
return $result[0] + 10;
}
$string = 'age: 10, year: 2011, another number: 56';
echo preg_replace_callback('#\d+#', 'myfunction', $string);
// Array ( [0] => 10 ) Array ( [0] => 2011 ) Array ( [0] => 56 )
// age: 20, year: 2021, another number: 66
{
print_r($result);
return $result[0] + 10;
}
$string = 'age: 10, year: 2011, another number: 56';
echo preg_replace_callback('#\d+#', 'myfunction', $string);
// Array ( [0] => 10 ) Array ( [0] => 2011 ) Array ( [0] => 56 )
// age: 20, year: 2021, another number: 66
נחפש כל קטע שמורכב מספרה אחת או יותר. קטע מחרוזת זה מוצב במערך בדומה לזה של preg_match ומועבר לפונקציה myfunction. הפונקציה myfunction מגדילה את המספר ב10 ומחזירה מספר חדש, שמשמש כתחליף למספר שנמצא.
כפי שניתן לראות, הפונקציה הופעלה שלוש פעמים, בעבור כל אחד מהחלקים
שנמצאו מתאימים לתבנית (עבור כל אחד משלושת המספרים).
חשוב: הפונקציה שלכם לא תקבל טקסט, אלה תקבל מערך results בדומה לזה שמפיקה preg_match. תוכלו לגשת לאלמנטים של המערך ולבצע עליהם פעולות כמו בדוגמה.
זהו זה
זה כל מה שיש לדעת על ביטויים רגולריים. קצת נסיון ותירגול יעזרו להבין את החומר עד הסוף. נסו לענות על כל השאלות שנמצאו כאן בצבע האפור שהתשובה בכולם היא א'. נסו להבין למה ולאחר מכן גשו לתרגילים האלא: פתרונות ושאלות תוכלו להוסיף בתגובות.
א. כתבו ביטוי לבדיקת תקינות כתובת אימייל
ב. כתבו ביטוי אחד לבדיקת תקינות טלפון קווי וסלולרי
ג. כתבו ביטוי שימצא את כל הקישורים בעמוד
ד. כתבו ביטוי שיחליף את ההוסט של הקישור ב phpguide.co.il אבל ישאיר את שם העמוד והפרמטרים.
יהפוך <a someattr='cool' href='https://example.com/search123'>
ל- <a someattr='cool' href='https://phpguide.co.il/search123'>
ולא משנה מה ההוסט המקורי.
שימוש בביטויים רגולריים עם mod_rewrite
תגובות לכתבה:
דבר ראשון תודה רבה על המדריך המעולה!
דבר שני, ניסיתי לעשות את ה"שיעורי בית",
הגעתי לג', ונתקלתי בבעיה קטנה:
לדוגמא יש קישור, ולאחר מכן טקסט, ואז עוד קישור,
זה יציג את הקישור, את הטקסט, ואת הקישור שאחריו.
איך אני יכול לעשות שזה לא יציג את הטקסט הזה באמצע ?
כי לדוגמא אם יש רק קישור, טקסט ואין קישור אח"כ זה מציג טוב.
הנה הפטרן : $preg = "#<a href=('|\").+('|\")\s*>\w+<\/a>#";
תודה!
היי שי. תודה על התגובה שלך.
כרגע הביטוי הרגולרי שלך פועל באופן "קמצני" כלומר הוא מנסה לתפוס חלק כמה שיותר גדול מהמחרוזת שתואמת לביטוי.
המודיפיקטור U יגרום לו לעצור אחרי שימצא את החלק הכי קצר שתואם לביטוי שלך.
אשמח אם נעביר את את הדיון שלנו לפורום, שנותן אפשרויות עריכה נוחות יותר.
היי,
יש אפשרות לחסום עם preg_match את התווים של סוגריים מרובעים ? ] [ ?
מה עם תו הברחה?
אולי תוכלו להביא תשובה לביטוי אחד לבדיקת תקינות טלפון קווי וסלולרי?
תוכל לשאול שאלה בפורום או דרך שאלות-ותשובות ונשמח לעזור בכל שאלה פרטנית שהיא.
תודה רבה. מדריך מעולה.
אבל יש משהו שחיפשתי ולא מצאתי כאן: איך אני יכול להגדיר 'שלילה'.
נגיד שיש לי מחרוזת של כמה משפטים, שכל אחד מהם מסתיים עם נקודה (ויתכן גם שאין שם שום נקודה כלל), ואני רוצה להוציא את המפשט הראשון, זאת אומרת עד הנקודה. אני מניח שאני אמור לחפש ^.* ולהוסיף בסוף שלילה של נקודה.
איך אני עושה את זה?
שלילה אתה יכול באמצעות הסוגריים המרובעים []. כאשר בהתחלה תכתוב ^. כך שזה אמור לצאת לך:
[^.] (אבל משמאל לימין)
הבעיה היחידה שאני מצאתי בזה הוא שזה מחשיב גם את ה-^ כאחד מהסימנים האסורים. זה כל מה שאני יודע.
שלום אלכס,
ברצוני להפוך את הכתובת הבאה:
/מבצעים/מבצעי+שתיה
לכתובת:
/מבצעים/מבצעי_שתיה
ניסיתי דבר כזה:
מבצעים/(\w+)\+(\w+)\/?$
אך משום מה כנראה שה+ בURL לא נחשב ל+ רגיל...
יש פיתרון ?